//
//  iostreamFormat.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/7/9.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef iostreamFormat_hpp
#define iostreamFormat_hpp

#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <ios>
using namespace std;
class SecondIostream {
    
public:
    SecondIostream(){
        
    }
    
    ~SecondIostream(){
        
    }
    
    //flag
    void testFlag(){
        //打开开关
//        std::cout.setf(std::ios::showpos | std::ios::uppercase);//可以使用OR（|）运算符一次打开多个ios标志：
//        //关闭开关
//        std::cout.unsetf(std::ios::showpos);
//
//        //有些开关互斥，如hex & dec,默认dec打开的，所以打开hex之前需关闭dec，因为他无法自动关闭
//        std::cout.unsetf(std::ios::dec);
//        std::cout.setf(std::ios::hex);
        
//        第二种方法是使用另一种形式的setf（），它接受两个参数：第一个参数是要设置的标志，第二个参数是它所属的格式化组。 使用这种形式的setf（）时，属于该组的所有标志都将被关闭，并且只有传入的标志才会打开。
        
//        std::cout.setf(std::ios::hex,std::ios::basefield);
        
//        使用setf（）和unsetf（）往往很尴尬，因此C ++提供了另一种更改格式选项的方法：操纵器。 关于操纵器的好处是它们足够聪明，可以打开和关闭相应的标志。 以下是使用一些操纵器来更改基础的示例：
        
//        std::cout << std::hex << 27 << '\n';
//        std::cout << std::dec << 29 << '\n';
        
        //是否打印true,false
        std::cout << noboolalpha << true << " " << false << '\n';
        std::cout << boolalpha << true << " " << false << '\n';
        //如果设置，则使用+前缀正数
        std::cout << noshowpos << 5 << '\n';
        std::cout << showpos << 5 << '\n';
        //使用大写？
        std::cout << nouppercase << 12345678.9 << '\n';
        std::cout << uppercase << 12345678.9 << '\n';
        //进制
        std::cout << std::dec << 27 << '\n';
        std::cout << std::oct << 27 << '\n';
        std::cout << std::hex << 27 << '\n';
        
        //精度
        std::cout << std::fixed << '\n';
        std::cout << std::setprecision(3) << 123.456 << '\n';
        std::cout << std::setprecision(4) << 123.456 << '\n';
        std::cout << std::setprecision(5) << 123.456 << '\n';
        std::cout << std::setprecision(6) << 123.456 << '\n';
        std::cout << std::setprecision(7) << 123.456 << '\n';
        
        std::cout << std::scientific << '\n';
        std::cout << std::setprecision(3) << 123.456 << '\n';
        std::cout << std::setprecision(4) << 123.456 << '\n';
        std::cout << std::setprecision(5) << 123.456 << '\n';
        std::cout << std::setprecision(6) << 123.456 << '\n';
        std::cout << std::setprecision(7) << 123.456 << '\n';
        
        //左对齐，右对齐
        //需要注意的一点是setw（）和width（）只影响下一个输出语句。 它们不像其他标志/操纵器那样持久。
        std::cout << std::setw(10) << left << -12345 << '\n'; // print left justified
        std::cout << std::setw(10) << right << -12345 << '\n'; // print right justified
        
        std::cout << 27 << "\n";
    }
    
    
    
};



#endif /* iostreamFormat_hpp */
